// 数据字典工具类

// 正则表达式匹配W+数字格式
const DICT_CODE_REGEX = /W\d+/g

// 正则表达式匹配Java枚举类名格式（字母+Enum结尾）
const ENUM_NAME_REGEX = /[A-Za-z]+Enum\b/g

/**
 * 从注释中提取字典编码
 * @param {string} comment - 字段注释
 * @returns {string[]} - 字典编码数组，如 ['W2947', 'W2657']
 */
export function extractDictCodes(comment) {
  if (!comment || typeof comment !== 'string') {
    return []
  }
  
  const matches = comment.match(DICT_CODE_REGEX)
  return matches ? [...new Set(matches)] : [] // 去重
}

/**
 * 判断注释中是否包含字典编码
 * @param {string} comment - 字段注释
 * @returns {boolean} - 是否包含字典编码
 */
export function hasDictCode(comment) {
  return extractDictCodes(comment).length > 0
}

/**
 * 获取注释中的第一个字典编码
 * @param {string} comment - 字段注释
 * @returns {string|null} - 第一个字典编码或null
 */
export function getFirstDictCode(comment) {
  const codes = extractDictCodes(comment)
  return codes.length > 0 ? codes[0] : null
}

/**
 * 格式化字典编码用于显示
 * @param {string} dictCode - 字典编码，如 'W2947'
 * @returns {string} - 格式化后的显示文本
 */
export function formatDictCodeDisplay(dictCode) {
  return `字典编码：${dictCode}`
}

/**
 * 从注释中提取Java枚举类名
 * @param {string} comment - 字段注释
 * @returns {string[]} - 枚举类名数组，如 ['DhbProjectPerformanceManagerAllotTaskTypeEnum', 'ProjectConstructionSendWrapTypeEnum']
 */
export function extractEnumNames(comment) {
  if (!comment || typeof comment !== 'string') {
    return []
  }
  
  const matches = comment.match(ENUM_NAME_REGEX)
  return matches ? [...new Set(matches)] : [] // 去重
}

/**
 * 判断注释中是否包含Java枚举类名
 * @param {string} comment - 字段注释
 * @returns {boolean} - 是否包含枚举类名
 */
export function hasEnumName(comment) {
  return extractEnumNames(comment).length > 0
}

/**
 * 获取注释中的第一个Java枚举类名
 * @param {string} comment - 字段注释
 * @returns {string|null} - 第一个枚举类名或null
 */
export function getFirstEnumName(comment) {
  const enumNames = extractEnumNames(comment)
  return enumNames.length > 0 ? enumNames[0] : null
}

/**
 * 格式化枚举类名用于显示
 * @param {string} enumName - 枚举类名，如 'DhbProjectPerformanceManagerAllotTaskTypeEnum'
 * @returns {string} - 格式化后的显示文本
 */
export function formatEnumNameDisplay(enumName) {
  return `枚举类：${enumName}`
}

// 测试用例（开发时使用）
if (process.env.NODE_ENV === 'development') {
  // 测试用例1
  const comment1 = "交付时间不变调整通知code，字典分类 施工进度计划调整通知-交付时间不变 字典编码W2947"
  console.assert(JSON.stringify(extractDictCodes(comment1)) === '["W2947"]', 'Test case 1 failed')
  console.assert(hasDictCode(comment1) === true, 'Test case 1 hasDictCode failed')
  
  // 测试用例2
  const comment2 = "进行阶段code（字典W2657）（废）"
  console.assert(JSON.stringify(extractDictCodes(comment2)) === '["W2657"]', 'Test case 2 failed')
  
  // 测试用例3
  const comment3 = "设计阶段code （字典设计阶段时间计划W2652）"
  console.assert(JSON.stringify(extractDictCodes(comment3)) === '["W2652"]', 'Test case 3 failed')
  
  // 测试用例4 - 多个字典编码
  const comment4 = "包含多个字典W1234和W5678的注释"
  console.assert(JSON.stringify(extractDictCodes(comment4)) === '["W1234","W5678"]', 'Test case 4 failed')
  
  // 测试用例5 - 无字典编码
  const comment5 = "普通的字段注释，没有字典编码"
  console.assert(JSON.stringify(extractDictCodes(comment5)) === '[]', 'Test case 5 failed')
  console.assert(hasDictCode(comment5) === false, 'Test case 5 hasDictCode failed')
  
  // 测试用例6 - 空值处理
  console.assert(JSON.stringify(extractDictCodes(null)) === '[]', 'Test case 6 null failed')
  console.assert(JSON.stringify(extractDictCodes(undefined)) === '[]', 'Test case 6 undefined failed')
  console.assert(JSON.stringify(extractDictCodes('')) === '[]', 'Test case 6 empty failed')
  
  // 枚举测试用例1
  const enumComment1 = "项目经理派工类型DhbProjectPerformanceManagerAllotTaskTypeEnum"
  console.assert(JSON.stringify(extractEnumNames(enumComment1)) === '["DhbProjectPerformanceManagerAllotTaskTypeEnum"]', 'Enum test case 1 failed')
  console.assert(hasEnumName(enumComment1) === true, 'Enum test case 1 hasEnumName failed')
  console.assert(getFirstEnumName(enumComment1) === 'DhbProjectPerformanceManagerAllotTaskTypeEnum', 'Enum test case 1 getFirstEnumName failed')
  
  // 枚举测试用例2
  const enumComment2 = "发包类型（枚举ProjectConstructionSendWrapTypeEnum：1指定、2公开、3指定内部人员）"
  console.assert(JSON.stringify(extractEnumNames(enumComment2)) === '["ProjectConstructionSendWrapTypeEnum"]', 'Enum test case 2 failed')
  
  // 枚举测试用例3
  const enumComment3 = "任务状态(枚举ProjectConstructionWrapTaskTypeEnum: 1待发包、2待接单、3已接单、4已拒绝、5已终止)"
  console.assert(JSON.stringify(extractEnumNames(enumComment3)) === '["ProjectConstructionWrapTaskTypeEnum"]', 'Enum test case 3 failed')
  
  // 枚举测试用例4
  const enumComment4 = "1主材2商品3分区4辅材DHBProjectBimMaterialTypeEnum"
  console.assert(JSON.stringify(extractEnumNames(enumComment4)) === '["DHBProjectBimMaterialTypeEnum"]', 'Enum test case 4 failed')
  
  // 枚举测试用例5 - 无枚举类名
  const enumComment5 = "普通的字段注释，没有枚举类名"
  console.assert(JSON.stringify(extractEnumNames(enumComment5)) === '[]', 'Enum test case 5 failed')
  console.assert(hasEnumName(enumComment5) === false, 'Enum test case 5 hasEnumName failed')
  
  // 枚举测试用例6 - 空值处理
  console.assert(JSON.stringify(extractEnumNames(null)) === '[]', 'Enum test case 6 null failed')
  console.assert(JSON.stringify(extractEnumNames(undefined)) === '[]', 'Enum test case 6 undefined failed')
  console.assert(JSON.stringify(extractEnumNames('')) === '[]', 'Enum test case 6 empty failed')
  
  // 混合测试用例 - 同时包含字典编码和枚举类名
  const mixedComment = "状态字段（字典W2947，枚举StatusEnum）"
  console.assert(hasDictCode(mixedComment) === true, 'Mixed test case dict failed')
  console.assert(hasEnumName(mixedComment) === true, 'Mixed test case enum failed')
}